14623
1456
Quer melhorar esta postagem? Forneça respostas detalhadas a esta pergunta, incluindo citações e uma explicação de por que sua resposta está correta. Respostas sem detalhes suficientes podem ser editadas ou excluídas.
Eu adicionei arquivos por engano ao Git usando o comando:
git add myfile.txt
Ainda não executei o git commit. Existe uma maneira de desfazer isso, para que esses arquivos não sejam incluídos no commit? 
1
2
Próximo
Você pode desfazer git add antes de comprometer com
git reset 
que irá removê-lo do índice atual (a lista "prestes a ser confirmada") sem alterar nada mais.
Você pode usar
git reset
sem qualquer nome de arquivo para remover todas as alterações devidas. Isso pode ser útil quando há muitos arquivos a serem listados um por um em um período de tempo razoável.
Em versões antigas do Git, os comandos acima são equivalentes a git reset HEAD  e git reset HEAD respectivamente, e irão falhar se HEAD for indefinido (porque você ainda não fez nenhum commit em seu repositório) ou ambíguo (porque você criou um branch chamado HEAD, que é uma coisa estúpida que você não deveria fazer). Isso foi alterado no Git 1.8.2, entretanto, nas versões modernas do Git você pode usar os comandos acima mesmo antes de fazer seu primeiro commit:
"git reset" (sem opções ou parâmetros) usado para dar erro quando
você não tem nenhum commit em seu histórico, mas agora lhe dá
um índice vazio (para corresponder a um commit inexistente em que você nem mesmo está).
Documentação: git reset
|
Você quer:
git rm --cached 
Raciocínio:
Quando eu era novo nisso, tentei pela primeira vez
git reset.
(para desfazer toda a minha adição inicial), apenas para receber esta (não tão) mensagem útil:
fatal: Falha ao resolver 'HEAD' como uma referência válida.
Acontece que isso ocorre porque o HEAD ref (branch?) Não existe até depois do primeiro commit. Ou seja, você terá o mesmo problema de iniciante que eu se seu fluxo de trabalho, como o meu, for algo como:
cd para o meu novo diretório de projeto para experimentar Git, o novo hotness
git init
git add.
git status
... muitos rolos de lixo por ...
=> Droga, eu não queria adicionar tudo isso.
google "desfazer git add"
=> localizar Stack Overflow - yay
git reset.
=> fatal: Falha ao resolver 'HEAD' como uma referência válida.
Além disso, descobriu-se que há um bug registrado contra a inutilidade disso na lista de discussão.
E que a solução correta estava bem ali na saída de status do Git (que, sim, eu encolhi como 'uma porcaria)
...
# Mudanças a serem confirmadas:
# (use "git rm --cached  ..." para remover o palco)
...
E a solução de fato é usar git rm --cached FILE.
Observe os avisos em outros lugares aqui - git rm deleta sua cópia de trabalho local do arquivo, mas não se você usar --cached. Aqui está o resultado do git help rm:
- em cache
Use esta opção para remover o estágio e remover caminhos apenas do índice.
Os arquivos da árvore de trabalho, modificados ou não, serão deixados.
Eu continuo a usar
git rm --cached.
para remover tudo e começar de novo. Não funcionou, porém, porque enquanto adiciona. é recursivo, acontece que rm precisa de -r para recursar. Suspiro.
git rm -r --cached.
Ok, agora estou de volta ao ponto de partida. Da próxima vez, usarei -n para fazer uma simulação e ver o que será adicionado:
git add -n.
Eu fechei tudo em um lugar seguro antes de confiar no git help rm sobre o --cached não destruir nada (e se eu tivesse escrito errado).
|
Se você digitar:
git status
O Git dirá o que é encenado, etc., incluindo instruções sobre como descomprimir:
use "git reset HEAD  ..." para remover o palco
Acho que o Git faz um ótimo trabalho me cutucando para fazer a coisa certa em situações como essa.
Observação: as versões recentes do Git (1.8.4.x) alteraram esta mensagem:
(use "git rm --cached  ..." para remover o palco)
|
Para esclarecer: git add move as alterações do diretório de trabalho atual para a área de teste (índice).
Esse processo é chamado de teste. Portanto, o comando mais natural para preparar as alterações (arquivos alterados) é o mais óbvio:
git stage
git add é apenas um alias mais fácil de digitar para o estágio git
Pena que não há comandos git unstage nem git unadd. O relevante é mais difícil de adivinhar ou lembrar, mas é bastante óbvio:
git reset HEAD -
Podemos facilmente criar um alias para isso:
git config --global alias.unadd 'reset HEAD -'
git config --global alias.unstage 'reset HEAD -'
E, finalmente, temos novos comandos:
git add file1
git stage file2
git unadd file2
git unstage file1
Pessoalmente, eu uso aliases ainda mais curtos:
git a # For staging
git u # Para unstaging
|
Além da resposta aceita, se o arquivo adicionado por engano era enorme, você provavelmente notará que, mesmo depois de removê-lo do índice com 'git reset', ele ainda parece ocupar espaço no diretório .git.
Não há nada para se preocupar; o arquivo de fato ainda está no repositório, mas apenas como um "objeto solto". Ele não será copiado para outros repositórios (por meio de clone, push) e o espaço será eventualmente recuperado - embora talvez não muito em breve. Se você está ansioso, pode executar:
git gc --prune = now
Atualização (o que se segue é minha tentativa de esclarecer algumas confusões que podem surgir das respostas mais votadas):
Então, qual é o verdadeiro desfazer do git add?
git reset HEAD ?
ou
git rm --cached ?
A rigor, e se não me engano: nenhum.
git add não pode ser desfeito - com segurança, em geral.
Vamos lembrar primeiro o que git add  realmente faz:
Se  não foi rastreado anteriormente, git add o adiciona ao cache, com seu conteúdo atual.
Se  já foi rastreado, git add salva o conteúdo atual (instantâneo, versão) no cache. No Git, essa ação ainda é chamada de adicionar (não apenas atualizá-lo), porque duas versões diferentes (instantâneos) de um arquivo são considerados dois itens diferentes: portanto, estamos de fato adicionando um novo item ao cache, para ser eventualmente cometido mais tarde.
À luz disso, a questão é um pouco ambígua:
Eu adicionei arquivos por engano usando o comando ...
O cenário do OP parece ser o primeiro (arquivo não rastreado), queremos o "desfazer" para remover o arquivo (não apenas o conteúdo atual) dos itens rastreados. Se for esse o caso, não há problema em executar git rm --cached .
E também poderíamos executar git reset HEAD . Em geral, isso é preferível, porque funciona em ambos os cenários: também desfaz quando adicionamos incorretamente uma versão de um item já rastreado.
Mas existem duas ressalvas.
Primeiro: Há (como apontado na resposta) apenas um cenário no qual git reset HEAD não funciona, mas git rm --cached sim: um novo repositório (sem commits). Mas, realmente, este é um caso praticamente irrelevante.
Segundo: Esteja ciente de que git reset HEAD não pode recuperar magicamente o conteúdo do arquivo previamente armazenado em cache, ele apenas o ressincroniza a partir do HEAD. Se nosso erro git add sobrescrever uma versão anterior não confirmada, não poderemos recuperá-la. É por isso que, estritamente falando, não podemos desfazer [*].
Exemplo:
$ git init
$ echo "versão 1"> arquivo.txt
$ git add file.txt # Primeira adição de file.txt
$ git commit -m 'primeiro commit'
$ echo "versão 2"> arquivo.txt
$ git add file.txt # Estágio (não confirmar) "versão 2" do arquivo.txt
$ git diff --cached file.txt
-versão 1
+ versão 2
$ echo "versão 3"> arquivo.txt
$ git diff file.txt
-versão 2
+ versão 3
$ git add file.txt # Opa, não foi isso que quisemos dizer
$ git reset HEAD file.txt # Desfazer?
$ git diff --cached file.txt # Sem diferença, é claro. estágio == HEAD
$ git diff file.txt # Perdemos irrevogavelmente a "versão 2"
-versão 1
+ versão 3
Claro, isso não é muito crítico se seguirmos o fluxo de trabalho preguiçoso usual de fazer 'git add' apenas para adicionar novos arquivos (caso 1), e atualizarmos novos conteúdos por meio do comando commit, git commit -a.
**
|
Desfazer um arquivo que já foi adicionado é muito fácil usando o Git. Para redefinir meuarquivo.txt, que já foi adicionado, use:
git reset HEAD meuarquivo.txt
Explicação:
Depois de testar arquivo (s) indesejado (s), para desfazer, você pode fazer git reset. Head é o head do seu arquivo no local e o último parâmetro é o nome do seu arquivo.
Criei as etapas da imagem abaixo em mais detalhes para você, incluindo todas as etapas que podem acontecer nestes casos:
|
git rm --cached. -r
irá "des-adicionar" tudo o que você adicionou do seu diretório atual recursivamente
|
Corre
git gui
e remova todos os arquivos manualmente ou selecionando todos eles e clicando no botão unstage from commit.
|
A questão não está claramente colocada. O motivo é que git add tem dois significados:
adicionar um novo arquivo à área de teste e desfazer com git rm - arquivo em cache.
adicionar um arquivo modificado à área de teste e desfazer com git reset HEAD file.
Em caso de dúvida, use
git reset arquivo HEAD
Porque faz o esperado em ambos os casos.
Aviso: se você fizer git rm --cached file em um arquivo que foi modificado (um arquivo que existia antes no repositório), o arquivo será removido no git commit! Ele ainda existirá em seu sistema de arquivos, mas se alguém mais puxar seu commit, o arquivo será deletado de sua árvore de trabalho.
O git status dirá se o arquivo era um novo arquivo ou modificado:
No mestre de filial
Mudanças a serem confirmadas:
(use "git reset HEAD  ..." para remover o palco)
novo arquivo: my_new_file.txt
modificado: my_modified_file.txt
|
Git tem comandos para todas as ações imagináveis, mas precisa de amplo conhecimento para fazer as coisas certas e, por isso, é contra-intuitivo na melhor das hipóteses ...
O que você fez antes:
Alterou um arquivo e usou git add., Ou git add .
O que você quer:
Remova o arquivo do índice, mas mantenha-o com a versão e com alterações não confirmadas na cópia de trabalho:
git reset HEAD 
Redefina o arquivo para o último estado do HEAD, desfazendo as alterações e removendo-as do índice:
# Pense em `svn revert ` IIRC.
git reset HEAD 
git checkout 
# Se você tiver um `` nomeado como ``, use:
git checkout - 
Isso é necessário porque git reset --hard HEAD não funcionará com arquivos únicos.
Remova  do índice e da versão, mantendo o arquivo sem versão com as alterações na cópia de trabalho:
git rm --cached 
Remova o  da cópia de trabalho e controle de versão completamente:
git rm 
|
Se você está em seu commit inicial e não pode usar gitredefinir, basta declarar "falência do Git" e excluir a pasta .git e começar de novo
|
De acordo com muitas das outras respostas, você pode usar git reset
MAS:
Achei este pequeno post excelente que realmente adiciona o comando Git (bem, um alias) para git unadd: consulte git unadd para obter detalhes ou ..
Simplesmente,
git config --global alias.unadd "reset HEAD"
Agora você pode
git unadd foo.txt bar.txt
|
Use git add -i para remover arquivos recém-adicionados de seu próximo commit. Exemplo:
Adicionando o arquivo que você não queria:
$ git add foo
$ git status
# No branch master
# Mudanças a serem confirmadas:
# (use "git reset HEAD  ..." para remover o palco)
#
# novo arquivo: foo
#
# Arquivos não rastreados:
# (use "git add  ..." para incluir no que será confirmado)
# [...] #
Indo para adição interativa para desfazer sua adição (os comandos digitados em git aqui são "r" (reverter), "1" (a primeira entrada na lista mostra a reversão), 'retornar' para sair do modo de reversão e "q" (Sair):
$ git add -i
caminho não encenado
1: + 1 / -0 nada foo
*** Comandos ***
1: [s] tatus 2: [u] pdate 3: [r] evert 4: [a] dd untracked
5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp
E agora> r
caminho não encenado
1: + 1 / -0 nada [f] oo
Reverter >> 1
caminho não encenado
* 1: + 1 / -0 nada [f] oo
Reverter >>
nota: foo não está rastreado agora.
reverteu um caminho
*** Comandos ***
1: [s] tatus 2: [u] pdate 3: [r] evert 4: [a] dd não rastreado
5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp
E agora> q
Tchau.
$
É isso aí! Aqui está sua prova, mostrando que "foo" está de volta na lista não rastreada:
$ git status
# No branch master
# Arquivos não rastreados:
# (use "git add  ..." para incluir no que será confirmado)
# [...]
# foo
nada adicionado ao commit, mas arquivos não rastreados presentes (use "git add" para rastrear)
$
|
git remove ou git rm podem ser usados ​​para isso, com a opção --cached. Tentar:
git help rm
|
Esta é uma maneira de evitar esse problema incômodo ao iniciar um novo projeto:
Crie o diretório principal para seu novo projeto.
Execute git init.
Agora crie um arquivo .gitignore (mesmo se estiver vazio).
Confirme seu arquivo .gitignore.
Git torna muito difícil fazer git reset se você não tem nenhum commit. Se você criar um pequeno commit inicial apenas para ter um, depois disso, você pode executar git add -A e git reset quantas vezes quiser para fazer tudo certo.
Outra vantagem deste método é que se você tiver problemas de finalização de linha posteriormente e precisar atualizar todos os seus arquivos, é fácil:
Verifique aquele commit inicial. Isso removerá todos os seus arquivos.
Então verifique seu commit mais recente novamente. Isso irá recuperar novas cópias de seus arquivos, usando suas configurações de final de linha atuais.
|
Talvez o Git tenha evoluído desde que você postou sua pergunta.
$> git --version
git versão 1.6.2.1
Agora você pode tentar:
git reset HEAD.
Isso deve ser o que você está procurando.
|
Observe que, se você não especificar uma revisão, terá que incluir um separador. Exemplo do meu console:
git reset 
fatal: argumento ambíguo '': revisão desconhecida ou caminho que não está na árvore de trabalho.
Use '-' para separar os caminhos das revisões
git reset - 
Mudanças não planejadas após redefinição:
M 
(Git versão 1.7.5.4)
|
Para remover novos arquivos da área de teste (e apenas no caso de um novo arquivo), conforme sugerido acima:
git rm --Arquivo em cache
Use rm --cached apenas para novos arquivos adicionados acidentalmente.
|
Para redefinir cada arquivo em uma pasta específica (e suas subpastas), você pode usar o seguinte comando:
git reset *
|
Use o comando * para lidar com vários arquivos ao mesmo tempo:
git reset HEAD * .prj
git reset HEAD * .bmp
git reset HEAD * gdb *
etc.
|
Basta digitar git reset, ele reverterá e é como se você nunca tivesse digitado git add. desde o seu último commit. Certifique-se de ter se comprometido antes.
|
Suponha que eu crie um novo arquivo, newFile.txt:
Suponha que eu adicione o arquivo acidentalmente, git add newFile.txt:
Agora eu quero desfazer este add, antes de confirmar, git reset newFile.txt:
|
Para um arquivo específico:
git reset my_file.txt
git checkout my_file.txt
Para todos os arquivos adicionados:
git reset.
git checkout.
Nota: o checkout altera o código nos arquivos e passa para o estado da última atualização (confirmada). reset não altera os códigos; ele apenas redefine o cabeçalho.
|
Para desfazer git add, use:
git reset filename
|
Este comando irá unstash suas alterações:
git reset HEAD filename.txt
Você também pode usar
git add -p
para adicionar partes de arquivos.
|
Também existe o modo interativo:
git add -i
Escolha a opção 3 para cancelar a adição de arquivos. No meu caso, geralmente desejo adicionar mais de um arquivo e, com o modo interativo, você pode usar números como este para adicionar arquivos. Isso levará tudo, exceto 4: 1, 2, 3 e 5
Para escolher uma sequência, basta digitar 1-5 para selecionar de 1 a 5.
Arquivos de teste Git
|
git add myfile.txt # Isto irá adicionar o seu arquivo na lista a ser confirmada
O oposto deste comando é,
git reset HEAD myfile.txt # Isso irá desfazeristo.
então, você estará no estado anterior. O especificado estará novamente na lista não rastreada (estado anterior).
Ele irá reiniciar sua cabeça com aquele arquivo especificado. então, se sua cabeça não tiver meios, ele simplesmente o zera.
|
git reset filename.txt
Irá remover um arquivo chamado filename.txt do índice atual, a área "prestes a ser confirmada", sem alterar nada mais.
|
git reset filename.txt
Irá remover um arquivo chamado filename.txt do índice atual, a área "prestes a ser confirmada", sem alterar nada mais.
|
No Sourcetree, você pode fazer isso facilmente por meio da GUI.
Você pode verificar qual comando Sourcetree usa para remover o estágio de um arquivo.
Criei um novo arquivo e o adicionei ao Git. Em seguida, desmontei o cenário usando a GUI do Sourcetree.
Este é o resultado:
Arquivos de remoção de teste [12/08/15 10:43]
git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = redefinição da árvore de origem -q - caminho / para / arquivo / nome do arquivo.java
Sourcetree usa reset para remover o estágio de novos arquivos.
|
1
2
Próximo
Questão altamente ativa. Ganhe 10 reputação para responder a esta pergunta. O requisito de reputação ajuda a proteger essa pergunta contra spam e atividades sem resposta.
Não é a resposta que você está procurando? Navegue por outras questões com a tag git version-control git-commit git-stage ou faça sua própria pergunta.